Baner
; В начало ; Новости ; Теория ; Ресурсы ; Ссылки ; Форум ; Почта ;
Математика и физика
2D графика

   DirectDraw:
3D графика

   OpenGL:
Rambler's Top100 Rambler's Top100
Объявление функции в .h файле:
#define LT_LINE		1
#define LT_RAY		2
#define LT_SEGMENT	3

bool FindLinesIntersect(CVertex A1, CVertex A2, unsigned ALineType,
			CVertex B1, CVertex B2, unsigned BLineType,
			CVertex* Result);
Описаниее в .cpp файле:
bool FindLinesIntersect(CVertex A1, CVertex A2, unsigned ALineType,
			CVertex B1, CVertex B2, unsigned BLineType,
			CVertex* Result)
{
	//Проверка на принадлежность одной плоскости
	CPlane pl(A1, A2, B2);
	if (!B1.IsInPlane(pl)) return false;

	float D = (A2.y-A1.y)*(B1.x-B2.x)-(B1.y-B2.y)*(A2.x-A1.x);
	float U1= (A2.y-A1.y)*(B1.x-A1.x)-(B1.y-A1.y)*(A2.x-A1.x);
	float U2= (B1.y-A1.y)*(B1.x-B2.x)-(B1.y-B2.y)*(B1.x-A1.x);

	float p1, p2;

	if(D!=0)
	{
		p1=U1/D;
		p2=U2/D;
		bool check1 = false;
		bool check2 = false;

		if (ALineType==LT_LINE) check1 = true;
		if (BLineType==LT_LINE) check2 = true;		

		if (ALineType==LT_RAY && p2>=0)
			check1 = true;
		if (BLineType==LT_RAY && p1>=0)
			check2 = true;
		if (ALineType==LT_SEGMENT && p2>=0 && p2<=1)
			 check1 = true;
		if (BLineType==LT_SEGMENT && p1>=0 && p1<=1)
			 check2 = true;

		if(check1 && check2)
		{
			Result->x=A1.x+(A2.x-A1.x)*p2;
			Result->y=A1.y+(A2.y-A1.y)*p2;
			Result->z=A1.z+(A2.z-A1.z)*p2;
			return true;
		}
		else
		{
			return false;  //Parallel
		}
	}
	else
	{
		return false;
	}
}
В классе CVertex добавляем функции для определения расстояния до линии и проверку принадлежности точки этой линии:
float CVertex::DistanceTo(const CVertex& V1, 
		const CVertex& V2) const //Distance to line
{
	const float a = this->DistanceTo(V1);
	const float b = this->DistanceTo(V2);
	const float c = V2.DistanceTo(V1);
	const float p = (a+b+c)/2;
	return (float)(2/c*sqrt(p*(p-a)*(p-b)*(p-c)));
}

bool CVertex::IsOnLine(const CVertex& V1,
		const CVertex& V2, unsigned LineType)const
{
	CVector Dir(V1, V2);
	CVector Ver(V1, *this);
	CVector DirN = Dir.GetNormalized();
	CVector VerN = Ver.GetNormalized();
	if (DirN == VerN) //Same Direction
	{
		if (LineType == LT_LINE || LineType == LT_RAY)
			return true;
		else if (Dir.Magnitude() > Ver.Magnitude())
			return true;
		else
			return false;
	}
	else if (DirN == -VerN && LineType == LT_LINE)
		return true;
	else
		return false;
}
Файл со всеми классами геометрических операций можно найти, например, в главе шаблоны для OpenGL.
Используются технологии uCoz